Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Introduce Conftest
Search
yuhara
September 08, 2020
Technology
560
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Introduce Conftest
yuhara
September 08, 2020
More Decks by yuhara
See All by yuhara
managed_Kubernetes_on-premises.pdf
yuhara
1
900
Other Decks in Technology
See All in Technology
AIをフル活用してオンコール機能のプロトタイプを2日で作った話 / Building an AI-Powered On-Call Prototype in Just Two Days
nari_ex
0
170
CVE-2026-20833_脆弱性対応とAES 化について
jukishiya
0
350
スタートアップにおけるアジャイルの実践について #shibuyagile
murabayashi
3
2k
勉強会企画をアプリで構造化してみた 〜そこで見えた、AIとの付き合い方〜 / I've structured a study group plan using an app.
pauli
0
300
プライバシー保護の理論と実践
lycorptech_jp
PRO
1
240
初めてのDatabricks勉強会
taka_aki
2
230
MySQL & MySQL HeatWave Report - June 2026
freshdaz
0
300
AI駆動開発におけるQAエンジニアの役割事例 〜AI駆動開発の現場から〜
kobayashiyorimitsu
0
290
AIに「使われる」時代のSaaS戦略 〜既存WebAPIのMCPサーバー化における開発ノウハウ〜
ekispert_api
0
290
インフラ寄りSREでも 開発に踏み出せる〜境界を越えてユーザー体験に向き合いたい〜
sansantech
PRO
0
190
アラート調査向けAIエージェントの本番導入とその後/AI Agents for Alert Investigation: Production Deployment and After
taddy_919
1
340
Amazon EVS で VCF 9.0 / 9.1 のサポート開始まとめ
mtoyoda
0
180
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
528
40k
Everyday Curiosity
cassininazir
0
250
Game over? The fight for quality and originality in the time of robots
wayneb77
1
220
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Mind Mapping
helmedeiros
PRO
1
280
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
180
Faster Mobile Websites
deanohume
310
32k
Producing Creativity
orderedlist
PRO
348
40k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Rails Girls Zürich Keynote
gr2m
96
14k
The agentic SEO stack - context over prompts
schlessera
0
840
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Transcript
CloudNative Days Tokyo 2020 RegoによるOPAポリシーの開発と Conftestを活用したポリシーチェックの実現 Merpay
SRE Takaaki Yuhara
Agenda Conftest利用の背景 Regoで記述したポリシーとConftestの活用 ポリシーの開発とテスト 01 02 03
Conftest利用の背景 Regoで記述したポリシーとConftestの活用 ポリシーの開発とテスト 01 02 03
メルペイのシステム概要 • マイクロサービスアーキテクチャ • Google Cloud Platform(GCP)を利用 • アプリケーションはKubernetes上で稼働 •
マイクロサービスはそれぞれ下記が割り当てられる ◦ GCP Project ◦ Kubernetes Namespace
構成とフローの概略図 Kubernetes Project Project A Project B Service A Team
Service B Team Repository(GCP) Namespace A Namespace B Repository(k8s) Cloud Spanner Cloud Spanner Cloud Pub/Sub BigQuery Kubernetes Cluster CircleCI YAML HCL (Terraform)
Production Readiness Checklist • サービスを安全にリリースするためのチェックリスト • マイクロサービスのリリース前にチェックを行う • 例) ◦
Kubernetes ▪ CPUやMemoryのrequestsとlimits ▪ preStop ▪ livenessProbe / readinessProbe ▪ runAsNonRoot ▪ HorizontalPodAutoscaler ▪ PodDisruptionBudget ◦ GCP ▪ Databaseのバックアップ ▪ Cloud StorageのObject Lifecycle Management
Open Policy Agent(OPA) https://www.openpolicyagent.org/docs/latest/ • OSSの汎用ポリシーエンジン • CNCFのincubatingのプロジェクト • Regoというポリシー記述言語で
ポリシーを書く • ポリシーと入力されたデータを評価し結 果を返す
Gatekeeper • Gatekeeper ◦ OPAをKubernetes上で使えるよう にしたもの ◦ KubernetesのAdmission Controllerと連携してOPAを利用 ◦
Webhook先をOPAにすることで API Server側でポリシーチェック https://www.openpolicyagent.org/docs/latest/kubernetes-introduction/
Gatekeeper • ConstraintTemplateとConstraint というCRDでポリシーを定義 • Regoによるポリシーは ConstraintTemplate内に記述 https://github.com/open-policy-agent/gatekeeper
Conftest • Regoで記述したポリシーと入力データをコマンドラインで検証するツール • CI上で使われることを想定している • リモートにあるRegoのポリシーを利用できる • 様々なフォーマットに対応 ❏
YAML ❏ JSON ❏ INI ❏ TOML ❏ HOCON ❏ HCL ❏ HCL1 ❏ CUE ❏ Dockerfile ❏ EDN ❏ VCL ❏ XML ❏ Jsonnet
なぜConftestを使い始めたか • もともとCIでterraform planやkubectl validate/dry-runでの失敗を通知していて、ポ リシーチェックも導入しやすかった • Conftestが様々なフォーマットに対応している ◦ GCPのクラウドリソースはHCL形式のTerraformで管理
◦ KubernetesのマニフェストはYAMLで管理 • KubernetesではRegoで記述したポリシーをCIとAPI Server側で両側面でチェックで きる ◦ CI時のチェックはConftest ◦ API Server側でのチェックはGatekeeper
Conftest利用の背景 Regoで記述したポリシーとConftestの活用 ポリシーの開発とテスト 01 02 03
テストシナリオ • 例)HorizontalPodAutoscalerのspec.minReplicasが3以上であること apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: php-apache
spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: php-apache minReplicas: 3 maxReplicas: 10 metrics: - type: Resource resource: <以下、省略> minReplicasが省略されていたり、 値が3未満の場合は事前に気付きたい
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } • 例)HorizontalPodAutoscalerのspec.minReplicasが3以上であること
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } package名は任意。
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } ルール名は deny, violation, warn を使うことができる。 deny, violationではルールに合致するとExit codeが1, warnではルールに合致してもExit codeが0 ルール名をviolation_xxxなどのように指定してもOK
デバッグ時の出力 内部でdata.<package名>.<ルール名> という形で扱われているためルール名を分けておくと便利
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } ルールに合致した場合に返す値
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } 入力データ(input)のkindがHorizontalPodAutoscalerであるか評価 (Gatekeeperでは入力データが input.review.objectなのでConftestとGatekeeper両方でポリシーを使う場合は入 力データを評価するような判定を入れると良い)
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } input.spec.minReplicas が3以上であればgoodという変数にtrueが代入。3未満ならfalseが代入される。
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } パイプの左のgoodという変数に値を渡しています。つまりsatisfiedは要素が1つのarrayとなります。ただし minReplicasが省略されている場合はgoodが空なのでsatisfiedは要素が0のarrayです。 satisfied minReplicasが3以上 [true] minReplicasが3未満 [false] minReplicasが省略 []
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } any関数でsatisfied内に1つでもtrueがある場合はtrueとなる。 satisfied any(satisfied) minReplicasが3以上 [true] true minReplicasが3未満 [false] false minReplicasが省略 [] false
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } spec.minReplicasが3以上でない場合を条件として合致させたいため、否定のnotを使用 satisfied any(satisfied) not any(satisfied) minReplicasが3以上 [true] true false minReplicasが3未満 [false] false true minReplicasが省略 [] false true
Regoでポリシーを記述 package hpa description := "This is production readiness check
itme, please check http://~" violation_min_replicas_is_not_set[{"msg": msg, "description": description}] { input.kind = "HorizontalPodAutoscaler" satisfied := [good | good := input.spec.minReplicas >= 3] not any(satisfied) msg := sprintf("minReplicas in HorizontalPodAutoscaler %s must be set", [input.metadata.name]) } 最後にmsgを生成
コマンド実行時の出力(JSON) [ { "filename": "sample-hpa.yaml", "warnings": [], "failures": [ {
"msg": "minReplicas in HorizontalPodAutoscaler sample must be set", "metadata": { "description": "This is a production readiness check item, please check https://~" } } ], "successes": [] } ] $ conftest test --policy policy/hpa --namespace hpa --input yaml --output json sample-hpa.yaml ConftestをCIに組み込んで、 適切な情報をディベロッパーにフィードバック
Agenda Conftest利用の背景 Regoで記述したポリシーとConftestの活用 ポリシーの開発とテスト 01 02 03
ポリシーの開発とテスト • OPAではポリシーをコードで開発、運用できる(Policy as Code) • Regoのポリシーをテストするフレームワークがある • テスト用のルールはtest_xxxとする •
withキーワードを使って入力データをMockのデータに置き換えできる package hpa msg := "minReplicas in HorizontalPodAutoscaler sample must be set" test_min_replicas_less_than_three { violation_min_replicas_is_not_set[{"msg": msg, "description": description}] with input as { "kind": "HorizontalPodAutoscaler", "metadata": {"name": "php-apache"}, "spec": {"maxReplicas": 10, "minReplicas": 1} } }
テスト実行 • opa testコマンドを使ってテストを実行 • --coverage --format=jsonオプションをつけるとカバレッジも報告される $ opa test
-v hpa.rego hpa_test.rego data.hpa.test_min_replicas_less_than_three: PASS (2.977518ms) -------------------------------------------------------------------------------- PASS: 1/1 $ opa test --coverage --format=json hpa.rego hpa_test.rego | jq .coverage 60
まとめ • Production Readiness Checklistを適切にチェックし安全にリリースするためにOpen Policy AgentのConftestを利用し始めた • KubernetesのYAML manifestやTerraformのHCL等をCIでチェック
• Regoで記述したポリシーのテストもCIで実施
• 本日の内容は、下記のブログでも紹介しています https://engineering.mercari.com/blog/entry/introduce_conftest/